home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / gracil / p10dvr / rmtcfg.c < prev    next >
C/C++ Source or Header  |  1992-09-07  |  6KB  |  285 lines

  1. /****************************************************************************
  2. *
  3. *            COPYRIGHT 1990,91,92 BY GRACILIS INC.
  4. *
  5. *             623 Palace St.
  6. *             Aurora, Il. 60506
  7. *
  8. *             (708)-801-8800        Office
  9. *             (708)-844-0183        (FAX - Support BBS)
  10. *
  11. * GRACILIS, INC., MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS 
  12. * SOFTWARE FOR ANY PURPOSE.  
  13. *
  14. * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
  15. * Permission is granted for non-commercial use/distribution only, as long as
  16. * this copyright header is included intact and unaltered.
  17. *
  18. ******************************************************************************/
  19.  
  20.  
  21. /* Remote Configuration Server */
  22. #include <stdio.h>
  23. #include <string.h>
  24. #ifdef PACKETEN_PC
  25. #include <time.h>
  26. #include <sys/timeb.h>
  27. #endif
  28. #include "global.h"
  29. #include "files.h"
  30. #include "mbuf.h"
  31. #include "socket.h"
  32. #include "session.h"
  33. #include "proc.h"
  34. #include "dirutil.h"
  35. #include "commands.h"
  36. #include "mailbox.h"
  37. #include "config.h"
  38. #include "cmdparse.h"
  39. #include "netuser.h"
  40. #include "rmtcfg.h"        /* get the port # for the server to watch */
  41.  
  42. extern struct cmds Cmds[];
  43.  
  44. #ifdef PACKETEN            /* Are we building for a P10 itself? */
  45. #define RMTCFG_CLIENT 1
  46. #endif
  47.  
  48. #ifdef PACKETEN_PC        /* OR or we build a PC load to talk to a P10? */
  49. #define RMTCFG_SERVER 1
  50. #define RMTCFG_CLIENT 1
  51. #endif
  52.  
  53. static int Sremotesrv = -1;    /* Prototype socket for service */
  54.  
  55. #ifdef RMTCFG_SERVER
  56.  
  57. char    *Rmtcfg_dir="/rmtcfg";    /* Base directory for config files... */
  58.  
  59. static void rmtcfg_srv __ARGS((int s,void *unused,void *p));
  60.  
  61. /* Start up remote configuration service */
  62. int
  63. rmtcfg_start(argc,argv,p)
  64. int argc;
  65. char *argv[];
  66. void *p;
  67. {
  68.     struct sockaddr_in lsocket;
  69.     int s;
  70.  
  71.     if(Sremotesrv != -1){
  72.         return 0;
  73.     }
  74.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  75.     chname(Curproc,"RmtCfg listener");
  76.  
  77.     lsocket.sin_family = AF_INET;
  78.     lsocket.sin_addr.s_addr = INADDR_ANY;
  79.     if(argc < 2)
  80.         lsocket.sin_port = IPPORT_RMTCFG;
  81.     else
  82.         lsocket.sin_port = atoi(argv[1]);
  83.  
  84.     Sremotesrv = socket(AF_INET,SOCK_STREAM,0);
  85.     bind(Sremotesrv,(char *)&lsocket,sizeof(lsocket));
  86.     listen(Sremotesrv,1);
  87.     for(;;){
  88.         if((s = accept(Sremotesrv,NULLCHAR,(int *)NULL)) == -1)
  89.             break;    /* Service is shutting down */
  90.  
  91.         /* Spawn a server */
  92.         newproc("RmtCfg server",1024,rmtcfg_srv,s,NULL,NULL,0);
  93.     }
  94.     return 0;
  95. }
  96.  
  97. static void
  98. rmtcfg_srv(s,unused,p)
  99. int s;
  100. void *unused;
  101. void *p;
  102. {
  103.     char configfile[80];
  104.     FILE *fp;
  105.     char *file;
  106.  
  107.     sockmode(s,SOCK_ASCII);
  108.     sockowner(s,Curproc);
  109.  
  110.     log(s,"Remote Config Start");
  111.  
  112.     /* Wait for the name of the requested file from the remote end */
  113.     recvline(s,configfile,80);
  114.  
  115.     rip(configfile);
  116.  
  117.     /* If no config file is specified... */
  118.     if(strlen(configfile) == 0)
  119.     {
  120.         usprintf(s,"#Rmtcfg Server: No Filename Specified!\n");
  121.     }
  122.     else 
  123.     {
  124.         rmtcfg_read(s,configfile);
  125.     }
  126.     close_s(s);
  127.     log(s,"Remote Config Complete");
  128. }
  129.  
  130. int
  131. rmtcfg_stop(argc,argv,p)
  132. int argc;
  133. char *argv[];
  134. void *p;
  135. {
  136.     close_s(Sremotesrv);
  137.     Sremotesrv = -1;
  138.     return 0;
  139. }
  140.  
  141. /* Open a requested config file, read and send it to the given socket */
  142. rmtcfg_read(s,filename)
  143. int    s;
  144. char    *filename;
  145. {
  146. FILE    *fp;
  147. char    *file;        /* derived file name */
  148. int    sts;
  149. char buf[81];
  150.  
  151.     file = (char *)pathname(Rmtcfg_dir,filename);
  152.     log(s,"Opening config file: %s\n",file);
  153.  
  154.     if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  155.     {
  156.         usprintf(s,"#Config file: %s is unavailable.\n",file);
  157.         free(file);
  158.         return(0);
  159.     }
  160.     free(file);        /* free up the filename string */
  161.  
  162.     /* Send him a comment line with the filename in it... */
  163.     usprintf(s,"#Config file: %s:\n",file);
  164.  
  165.     while(fgets(buf,sizeof(buf),fp),!feof(fp))
  166.     {
  167.         usprintf(s,"%s",buf);
  168.         pwait(NULL);        /* give up the processor for others to run */
  169.     }
  170.  
  171.     fclose(fp);
  172.     return (0);
  173. }
  174.  
  175.  
  176. #endif    /* RMTCFG_SERVER */
  177.  
  178.  
  179. #ifdef RMTCFG_CLIENT
  180.  
  181. /* Remote configuration client */
  182.  
  183. int do_rmtcfg_request __ARGS((int argc,char *argv[],void *p));
  184.  
  185. /* Request configuration data from a remote server */
  186. do_rmtcfg_request(argc,argv,p)
  187. int    argc;
  188. char *argv[];
  189. void *p;
  190. {
  191.     struct sockaddr_in sock;
  192.     int     s;                /* socket # to use */
  193.     char    linebuf[81];    /* temp storage */
  194.     char    linetmp[81];    /* temp storage */
  195.     int        lineno;
  196.     char    ipaddr_buf[20];
  197.  
  198.     if(argc < 3)
  199.     {
  200.         tprintf("Usage: rmtcfg <server> <filename> [optional TCP Port #]\n");
  201.         return 1;
  202.     }
  203.  
  204.     sock.sin_family = AF_INET;
  205.  
  206.     if(argc >= 4) 
  207.     {
  208.         sock.sin_port = atoi(argv[3]);
  209.         if(sock.sin_port == 0) 
  210.         {
  211.             tprintf("Invalid PORT number: %s\n",argv[3]);
  212.             return 1;
  213.         }
  214.     }
  215.     else    sock.sin_port = IPPORT_RMTCFG;
  216.  
  217.     /* resolve the Rmtcfg_servers IP address... */
  218.     if((sock.sin_addr.s_addr = resolve(argv[1])) == 0){
  219.         /* If unable to resolve the address...*/
  220.         tprintf("Rmtcfg: %s is unknown.\n",argv[1]);
  221.         return 1;
  222.     }
  223.  
  224.     tprintf("Rmtcfg: File %s    Host %s    TCP port: %d.\n",
  225.                 argv[2],argv[1],sock.sin_port);
  226.  
  227.  
  228.     /* Allocate the socket... */
  229.     if((s = socket(AF_INET,SOCK_STREAM,0)) == -1){
  230.         /* If cant get a socket... */
  231.         tprintf("Rmtcfg: Can't allocate a Socket!\n");
  232.         return 1;
  233.     }
  234.     sockmode(s,SOCK_ASCII);
  235.  
  236.     /* Only wait for 1 minute... if no answer... then assume */
  237.     /* the server is down... */
  238.  
  239.     alarm((long)(60*(1000L/MSPTICK)));
  240.  
  241.     /* establish the connection... */
  242.     if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  243.         /* couldn't connect... */
  244.         close_s(s);
  245.         alarm(0L);
  246.         tprintf("Rmtcfg: Unsuccessful connect attempt.\n");
  247.         return 1;
  248.     }
  249.  
  250.     alarm(0L);
  251.  
  252.     /* tell the Rmtcfg server what file to send us... */
  253.     usprintf(s,"%s\n",argv[2]);
  254.     usflush(s);
  255.     
  256.     /* The bootup process better not take more than 60 Secs... */
  257.     alarm((long)(60*(1000L/MSPTICK)));
  258.  
  259.     lineno = 0;    
  260.     /* receive data till there is no more... */
  261.     while(recvline(s,linebuf,80) >= 0)
  262.     {
  263.         tprintf("%s",linebuf);
  264.         strcpy(linetmp,linebuf);
  265.         if(cmdparse(Cmds,linebuf,NULL) != 0)
  266.         {
  267.             tprintf("input line: %s",linetmp);
  268.         }
  269.         lineno++;                    
  270.     }
  271.  
  272.     alarm(0L);
  273.  
  274.     /* close the connection... */
  275.     close_s(s);
  276.  
  277.     /* Return successful completion of bootserver conversation */
  278.     return 0;
  279.  
  280. }
  281.  
  282. #endif
  283.  
  284.